Trivyの脆弱性スキャン結果をFutureVulsに連携してみた(CI/CD編)
Trivy は OSS のコンテナ脆弱性スキャンツールで、コンテナの OS パッケージやアプリケーションの依存ライブラリの脆弱性を検出します。
前回、コマンドラインから Trivy でスキャンした結果を脆弱性管理ツールの FutureVuls に連携してみました。
今回は実践的な CI/CD パイプラインに組み込んだパターンを GitHub Actions で作ります。
やってみた
以下の手順で進めます。
- ワークフローファイルを作成
- シークレットを設定
- コンテナ用意
- 実行
1. ワークフローファイルを作成
ワークフローでは以下を行います。
- GitHub Secrets に登録した認証情報をセット
- trivy(コンテナの脆弱性をスキャン)をインストール
- trivy-to-vuls(trivy のスキャン結果を vuls のレポート形式に変換)をインストール
- future-vuls(スキャン結果を FutureVuls にアップロード)をインストール
- コンテナをビルド
- trivy コンテナをスキャンし、結果を FutureVuls にアップロード
ワークフローのファイルはこちらです。
name: FutureVuls Docker Image Scan
on:
push
defaults:
run:
shell: bash
jobs:
docker-scan:
name: FutureVuls Docker Image Scan
env:
FVULS_AUTH_URL: "https://auth.vuls.biz/one-time-auth"
FVULS_GROUP_ID: ${{ secrets.FVULS_GROUP_ID }}
FVULS_SERVER_UUID: ${{ secrets.FVULS_SERVER_UUID }}
FVULS_TOKEN: ${{ secrets.FVULS_TOKEN }}
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
- name: cached scan db
uses: actions/cache@v2
with:
path: vulndb/
key: trivy-vulndb
- name: install trivy
env:
TRIVY_VERSION: 0.8.0
run: |
wget https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz
tar zxvf trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz
- name: install trivy-to-vuls
env:
VULS_VERSION: 0.10.0
run: |
wget https://github.com/future-architect/vuls/releases/download/v${VULS_VERSION}/trivy-to-vuls_${VULS_VERSION}_linux_amd64.tar.gz
tar zxvf trivy-to-vuls_${VULS_VERSION}_linux_amd64.tar.gz
- name: install future-vuls
env:
VULS_VERSION: 0.10.0
run: |
wget https://github.com/future-architect/vuls/releases/download/v${VULS_VERSION}/future-vuls_${VULS_VERSION}_linux_amd64.tar.gz
tar zxvf future-vuls_${VULS_VERSION}_linux_amd64.tar.gz
- name: scan core-rpc-server by trivy
env:
IMAGE_NAME: "nginx"
run: |
docker build -t ${IMAGE_NAME} .
set -eo pipefail
./trivy -q --cache-dir vulndb/ image -f=json ${IMAGE_NAME} | \
./trivy-to-vuls parse --stdin | \
./future-vuls upload --stdin --url ${FVULS_AUTH_URL} --group-id ${FVULS_GROUP_ID} --token ${FVULS_TOKEN} --uuid ${FVULS_SERVER_UUID}
2. シークレットを設定
GitHub リポジトリから Settings > Secrets を開き、以下のシークレットを登録します。
- FVULS_GROUP_ID
- FVULS_SERVER_UUID
- FVULS_TOKEN
FVULS_GROUP_ID
で FutureVuls のグループ ID を設定します。グループ ID は管理画面の URL から確認できます。
FVULS_SERVER_UUID
で FutureVuls で使用するサーバー ID(サーバーを一意に特定するための UUID)を設定します。(例)8E8D2C6F-8D70-4E5A-892D-52F3AD143D91
FVULS_TOKEN
で FutureVuls のスキャントークンを設定します。スキャントークンは、管理画面のグループ設定 > トークンから確認します。
3. コンテナ用意
スキャンさせるコンテナを用意します。
FROM nginx:1.18
COPY ./html /usr/share/nginx/html
<html>
<body>
<h1>Hello World!</h1>
</body>
</html>
最終的なディレクトリ構成は以下となります。
.
├── .github
│ └── workflows
│ └── scan.yml
├── Dockerfile
└── html
└── index.html
4. 実行
リポジトリにプッシュします。
$ git add -A
$ git commit -m 'initial commit'
$ git push
GitHub Actions のワークフローを確認します。
異常なく完了してました。
FutureVuls にスキャン結果が登録されていることを確認します。
[サーバ]タブをクリックすると nginx のコンテナが登録されていることがわかります。
[脆弱性]タブから、脆弱性も登録されていることを確認できました!
さいごに
Trivy でスキャンしたコンテナの情報を FutureVuls に登録を CI/CD パイプラインに組み込んでみました。
今回はスキャンして登録するまででしたが、実環境で使う際は、
- スキャン後にコンテナレジストリに登録
- 高スコアの脆弱性を通知
- 高スコアの脆弱性がある場合は、後続のデプロイ処理を中断
といったフローを作ることで、より安全なコンテナの運用をできそうです!